 
;Protokol

;SOH=1 ,Adresa='0' ,Prikaz='0',Cr=13 ,STX=3
;Suma je pocitana od adresy vcetne CR 


; Odeslani 
;SOH,Adresa,Prikaz,Znak0,Znak1,Tecka0,Znak2,Znak3,Tecka1,Znak4,Znak5,Cr,Suma


;prijem
;Teplota jsou ctyri Hexa znaky LL az HH

;STX,Adresa,'O','K',LL,LH,HL,HH,CR,Suma






 SendMess :  array[0..127] of byte;
  LSendMess  : Byte;
  LRecMess   : Byte;
  Temp:smallInt;


const
   MaxTime:word=80;
{----------------------------------------------------------------}

procedure Vysli;

label
  SendOk,SendOkP;

 begin
   sleep(3);
   with Chn do
   begin
    ChReceiveflush;
    ChSend(SendMess,LSendMess);
   end;
 end;


 {---------------------------------------------------------------}
Procedure OdesliCas;
var
 j:Integer;
 sum:byte;
 s:string[32];

 begin
  j:=0;
  SendMess[j]:=1;                                 inc(j); //SOH
  SendMess[j]:=Ord('0');  sum:=SendMess[j];       inc(j); //Adr
  SendMess[j]:=ord('0');  Inc(sum,SendMess[j]);   inc(j); //Prik


  S:=FormatDateTime('hh:mm:ss',Now);
  If (Ord(S[7]) mod 2) <>0 then
    begin                               //Cas
     If s[1]='0' then S[1]:=' ';
     SendMess[j]:=ord(s[1]);  Inc(sum,SendMess[j]);  inc(j); //Znak0
     SendMess[j]:=ord(s[2]);  Inc(sum,SendMess[j]);  inc(j); //Znak1
     SendMess[j]:=ord(s[3]);  Inc(sum,SendMess[j]);  inc(j); //Tecka1
     SendMess[j]:=ord(s[4]);  Inc(sum,SendMess[j]);  inc(j); //Znak2
     SendMess[j]:=ord(s[5]);  Inc(sum,SendMess[j]);  inc(j); //Znak3
     SendMess[j]:=ord(s[6]);  Inc(sum,SendMess[j]);  inc(j); //Tecka2
     SendMess[j]:=ord(s[7]);  Inc(sum,SendMess[j]);  inc(j); //Znak4
     SendMess[j]:=ord(s[8]);  Inc(sum,SendMess[j]);  inc(j); //Znak5
    end
   else
    begin                             // Teplota
     s:=FormatFloat('00.00',Temp/100);

     SendMess[j]:=ord(s[1]);  Inc(sum,SendMess[j]);  inc(j); //Znak0
     SendMess[j]:=ord(s[2]);  Inc(sum,SendMess[j]);  inc(j); //Znak1
     SendMess[j]:=ord('.');   Inc(sum,SendMess[j]);  inc(j); //Tecka1
     SendMess[j]:=ord(s[4]);  Inc(sum,SendMess[j]);  inc(j); //Znak2
     SendMess[j]:=ord(' ');   Inc(sum,SendMess[j]);  inc(j); //Znak3
     SendMess[j]:=ord('"');   Inc(sum,SendMess[j]);  inc(j); //Tecka2
     SendMess[j]:=ord('C');   Inc(sum,SendMess[j]);  inc(j); //Znak4
     SendMess[j]:=ord(' ');   Inc(sum,SendMess[j]);  inc(j); //Znak5
    end;


   SendMess[j]:=13;  Inc(sum,SendMess[j]);           inc(j);   //CR
   SendMess[j]:=Sum ;                                inc(j);   //SUM

  LSendMess:=j;
  Vysli;
 end;


{-------------------------------------------------------------}


Function CtiZnak(Var znak:Byte):boolean;
var
  I:word;
 begin
  i:=0;
  with Chn do
   begin
    while (ChReceiveReady<>CHS_ReceiveReady) and (I<= MaxTime) do
     begin
      Application.ProcessMessages;
      sleep(20);
      inc(i);
     end;
    if ChReceiveReady=CHS_ReceiveReady then
      begin
       Result:=False;
       Znak:=ChReceiveChar;
      end
     else
      Result:=true;
   end;
 end;


{--------------------------------------------------------------}

Procedure Prijmi;


Label Err,Kon;

Const
 STX=3;

var
  Znak:Byte;
  Sum:Byte;

Function  CtiHexInt(Var Co:SmallInt):boolean;
label
 Err;
var
 ZLL,ZLH,ZHL,ZHH:Byte;
 ErrI:integer;
 begin
  Result:=True;
  if CtiZnak(ZLL) then Goto Err;
  Inc(Sum,ZLL);
  if CtiZnak(ZLH) then Goto Err;
  Inc(Sum,ZLH);
  if CtiZnak(ZHL) then Goto Err;
  Inc(Sum,ZHL);
  if CtiZnak(zHH) then Goto Err;
  Inc(Sum,ZHH);

  val('$'+Chr(ZHH)+Chr(ZHL)+Chr(ZLH)+Chr(ZLL),Co,ErrI);
  if ErrI=0 then Result:=False;
Err:
 end;


begin
 MaxTime:=50;

 repeat
  if CtiZnak(znak) then Goto Err;  //STX
 until Znak=STX;
  Sum:=0;

  if CtiZnak(znak) then Goto Err;  //Adresa
  if Znak<>Ord('0') then Goto Err;
  Inc(Sum,Znak);

  if CtiZnak(znak) then Goto Err;  //O
  if Znak<>Ord('O') then Goto Err;
  Inc(Sum,Znak);

  if CtiZnak(znak) then Goto Err;  //K
  if Znak<>Ord('K') then Goto Err;
  Inc(Sum,Znak);

  if CtiHexInt(Temp)  then Goto Err;  //teplota

  if CtiZnak(znak) then Goto Err;  //CR
  if Znak<>13 then Goto Err;
  Inc(Sum,Znak);

  If CtiZnak(Znak)   then Goto Err;  //Suma
  if Sum<>Znak       then Goto Err;

  LRecMess:=1;
 goto Kon ;

err:
 LRecMess:=0;
 goto Kon;

Kon:
end;






;Tabulka znaku (lze doplnit o dalsi !)




                        ;GFEDCBA      
ZnTab:		db 	00000000b  ;20	Space		  AAAAAAAAAA
		db 	00000000b  ;21	!		F	     B
		db 	00000000b  ;22	"		F	     B
		db 	00000000b  ;23	#		F	     B
		db 	00000000b  ;24	$		F	     B
		db 	00000000b  ;25	%		F	     B
		db 	00000000b  ;26	&		  GGGGGGGGGG  	
		db 	00000000b  ;27	apostrof	E	     C
		db 	00000000b  ;28	(		E            C
		db 	00000000b  ;29	)		E	     C
		db 	00000000b  ;2a	*		E	     C
		db 	00000000b  ;2b	+		E            C
		db 	00000000b  ;2c	,	          DDDDDDDDDD
		db 	01000000b  ;2d	-	          
		db 	00000000b  ;2e	.	
		db 	00000000b  ;2f	/	

		        ;GFEDCBA   
		db 	00111111b  ;30	0		
		db 	00000110b  ;31  1
		db 	01011011b  ;32  2
		db 	01001111b  ;33	3		
		db 	01100110b  ;34  4
		db 	01101101b  ;35	5
		db 	01111101b  ;36	6
		db 	00000111b  ;37	7
		db 	01111111b  ;38	8
		db 	01101111b  ;39	9
		db 	00000000b  ;3a	:	
		db 	00000000b  ;3b	;	
		db 	00000000b  ;3c	<	
		db 	01010000b  ;3d	=	
		db 	00000000b  ;3e	>	
		db 	00000000b  ;3f	?	

			;GFEDCBA   
		db 	00000000b  ;40	@	
		db 	01110111b  ;41	A
		db 	01111100b  ;42	B
		db 	00111001b  ;43	C
		db 	01011110b  ;44	D
		db 	01111001b  ;45	E
		db 	01110001b  ;46	F
		db 	00000000b  ;47	G	
		db 	01110110b  ;48	H	
		db 	00000110b  ;49	I	
		db 	00011110b  ;4A	J	
		db 	00000000b  ;4B	K	
		db 	00000000b  ;4C	L	
		db 	00000000b  ;4D	M	
		db 	00000000b  ;4E	N	
		db 	00000000b  ;4F	O	

                        ;GFEDCBA   
		db 	00000000b  ;50	P	
		db 	00000000b  ;51	Q
		db 	00000000b  ;52	R
		db 	00000000b  ;53	S
		db 	00000000b  ;54	T
		db 	00000000b  ;55	U
		db 	00000000b  ;56	V
		db 	00000000b  ;57	W	
		db 	00000000b  ;58	X	
		db 	00000000b  ;59	Y	
		db 	00000000b  ;5A	Z	
		db 	00000000b  ;5B	[	
		db 	00000000b  ;5C	\	
		db 	00000000b  ;5D	]	
		db 	00000000b  ;5E	^	
		db 	00001000b  ;5F	_	

	                ;GFEDCBA   
		db 	00000000b  ;60	`	
		db 	01110111b  ;61	a
		db 	01111100b  ;62	b
		db 	01011000b  ;63	c
		db 	01011110b  ;64	d
		db 	01111001b  ;65	e
		db 	01110001b  ;66	f
		db 	00000000b  ;67	g	
		db 	00000000b  ;68	h	
		db 	00000000b  ;69	i	
		db 	00000000b  ;6A	j	
		db 	00000000b  ;6B	k	
		db 	00000000b  ;6C	l	
		db 	00000000b  ;6D	m	
		db 	00000000b  ;6E	n	
		db 	00000000b  ;6F	o	

                        ;GFEDCBA   
		db 	00000000b  ;70	p	
		db 	00000000b  ;71	q
		db 	01010000b  ;72  r
		db 	00000000b  ;73	s
		db 	00000000b  ;74	t
		db 	00000000b  ;75	u
		db 	00000000b  ;76	v
		db 	00000000b  ;77	w	
		db 	00000000b  ;78	x	
		db 	00000000b  ;79	y	
		db 	00000000b  ;7A	z	
		db 	00000000b  ;7B	{	
		db 	00000000b  ;7C	|	
		db 	00000000b  ;7D	}	
		db 	00000000b  ;7E	~	
		db 	00001000b  ;7F		



Propojeni rs485    
----------------------------------------------------
 A na A ,B na B  ,Zem na Zem

svorky na modulu  A,B,Zem,Zem,B,A
na prevodniku 232/485 je to napsano na desce 






;---------------------------------------------------

PrijmiRS:	Lds	PomReg,RsPrik	;Zapis textu na disp a cteni teploty 
		cpi	PomReg,'0'      ;(zustalo z minule verse programu)
		brne	PrijmiRS1
		rjmp	ZapisTextNaDisp 

PrijmiRS1:	Cpi	PomReg,'1'	;Cteni casu
		brne	PrijmiRS2
		rjmp	RSCtiCas

PrijmiRS2:	Cpi	PomReg,'2'	;Nastaveni casu
		brne	PrijmiRS3
		rjmp	RSNastavCas

PrijmiRS3:	Cpi	PomReg,'3'	;Cteni Stopek	
		brne	PrijmiRS4
		rjmp	RSStopky

PrijmiRS4:	Cpi	PomReg,'4'	;Cteni mezicasu
		brne	PrijmiRS5
		rjmp	RSMezi

PrijmiRS5:	Cpi	PomReg,'5'	;Start stopek 0
		brne	PrijmiRS6
		rjmp	RSStartSt0

PrijmiRS6:	Cpi	PomReg,'6'	;Mezicas 0 stopek 0
		brne	PrijmiRS7
		rjmp	RSMezi00

PrijmiRS7:	Cpi	PomReg,'7'	;Mezicas 1 stopek 0
		brne	PrijmiRS8
		rjmp	RSMezi01

PrijmiRS8:	Cpi	PomReg,'8'	;Mezicas 2 stopek 0
		brne	PrijmiRS9
		rjmp	RSMezi02

PrijmiRS9:	Cpi	PomReg,'9'	;Mezicas 3 stopek 0
		brne	PrijmiRSA
		rjmp	RSMezi03

PrijmiRSA:	Cpi	PomReg,'A'	;Start stopek 1
		brne	PrijmiRSB
		rjmp	RSStartSt1

PrijmiRSB:	Cpi	PomReg,'B'	;Mezicas 0 stopek 1
		brne	PrijmiRSC
		rjmp	RSMezi10

PrijmiRSC:	Cpi	PomReg,'C'	;Mezicas 1 stopek 1
		brne	PrijmiRSD
		rjmp	RSMezi11

PrijmiRSD:	Cpi	PomReg,'D'	;Mezicas 2 stopek 1
		brne	PrijmiRSE
		rjmp	RSMezi12

PrijmiRSE:	Cpi	PomReg,'E'	;Mezicas 3 stopek 1
		brne	PrijmiRSF
		rjmp	RSMezi13

PrijmiRSF:	Cpi	PomReg,'F'	;Nulovani stopek 0
		brne	PrijmiRSG
		rjmp	RSNuluj0

PrijmiRSG:	Cpi	PomReg,'G'	;Nulovani stopek 1
		brne	PrijmiRSH
		rjmp	RSNuluj1

PrijmiRSH:	Cpi	PomReg,'H'	;dotaz na Stav Vstupu
		brne	PrijmiRSI
		rjmp	RSVstupy

PrijmiRSI:	Cpi	PomReg,'I'	;dotaz na teplotu
		brne	PrijmiRSJ
		rjmp	RSTemp

PrijmiRSJ:	Cpi	PomReg,'J'	;nastaveni modu zobrazeni
		brne	PrijmiRSK
		rjmp	RSModZobr

PrijmiRSK:	Cpi	PomReg,'K'	;nastaveni masky 
		brne	PrijmiRSL
		rjmp	RSMask

PrijmiRSL:	Cpi	PomReg,'L'	;nastaveni masky 
		brne	PrijmiRSErr
		rjmp	RSImp

;----------------------------------
PrijmiRSErr:	rcall	StartZpravy

		Ldi	PomReg,'E'
		rcall	SerOut
		Ldi	PomReg,'R'
		rcall	SerOut
		Ldi	PomReg,'R'
		rcall	SerOut
		rjmp	KonecZpravy


;--------------------------------------
StartZpravy:	sbi	Smer
		ldi	PomReg,30
		rcall	Pauza

		ldi	PomReg,STX	;stx
		rcall	SerOut
		clr	Bcc
		lds	PomReg,Node	
		rjmp	SerOut		;adresa

;------------------------------------
KonecZpravy:	ldi	PomReg,13
		rcall	SerOut
		mov	PomReg,Bcc
		Rcall	SerOut
		ldi	PomReg,30
		rcall	Pauza
		cbi	Smer
		ldi	StavRx,stSOH
		ret



